<?php

class QueryCatalog {

    // Retrieves all departments
    public static function GetAllLogins() {
        // Build SQL query
        $sql = 'SELECT * FROM login';
        // Execute the query and return the results
        return DatabaseHandler::GetAll($sql);
    }

    public static function GetLogin($Login) {
        $sql = 'SELECT * FROM login WHERE login=:Login';
        $params = array(':Login' => $Login);
        return DatabaseHandler::GetRow($sql, $params);
    }

    public static function GetAllEquipaments() {
        $sql = 'SELECT * FROM equipamento';
        return DatabaseHandler::GetAll($sql);
    }

    public static function GetEquipament($EquipamentId) {
        $sql = 'SELECT * FROM equipamento WHERE idequipamento=:EquipamentId';
        $params = array(':EquipamentId' => $EquipamentId);
        return DatabaseHandler::GetRow($sql, $params);
    }

    public static function GetAllUsers() {
        $sql = 'SELECT * FROM responsavel';
        return DatabaseHandler::GetAll($sql);
    }

    public static function GetUser($Login) {
        $sql = 'SELECT * FROM responsavel WHERE fk_login=:FKLogin';
        $params = array(':FKLogin' => $Login);
        return DatabaseHandler::GetRow($sql, $params);
    }

    public static function addNewUser($login, $password, $password_hint, $cpf, $nome, $email, $telefone, $fk_idstatus) {

        $sql_1 = 'INSERT INTO login (login, password, password_hint) VALUES (:login, :password, :password_hint)';

        $params_1 = array(
            ':login' => $login,
            ':password' => $password,
            ':password_hint' => $password_hint
        );


        $sql_2 = 'INSERT INTO responsavel (cpf, nome, email, telefone, fk_login, fk_idstatus) VALUES (:cpf, :nome, :email, :telefone, :fk_login, :fk_idstatus)';

        $params_2 = array(
            ':cpf' => $cpf,
            ':nome' => $nome,
            ':email' => $email,
            ':telefone' => $telefone,
            ':fk_login' => $login,
            ':fk_idstatus' => $fk_idstatus
        );

        DatabaseHandler::Transaction($sql_1, $params_1, $sql_2, $params_2);
    }

    public static function addRequestEquip($login, $idEquip, $data_emprestimo, $data_devolucao, $hora_emprestimo, $hora_devolucao, $descricao_uso) {

        // Info sobre Responsavel
        $user = QueryCatalog::GetUser($login);
        $cpf = $user['cpf'];

        /* **************************************************************************
         * ***********************TRABALHANDO COM DATAS******************************
         * ************************************************************************** */
        // Dias de uso do equipamento:
        //$dias_em_uso = round(DateHandler::DateDiff($data_emprestimo, $data_devolucao));
        $array_datas = DateHandler::ArrayDateUntil($data_emprestimo, $data_devolucao);
        
        $sql1 = "INSERT INTO requisicao_equipamento (
            data_requisicao,
            hora_requisicao,
            data_retirada,
            hora_retirada,
            data_devolucao,
            hora_devolucao,
            descricao_uso,
            fk_cpf
            ) VALUES (
            :dt_requisicao,
            :hr_requisicao,
            :dt_retirada,
            :hr_retirada,
            :dt_devolucao,
            :hr_devolucao,
            :descricao_uso,
            :fk_cpf
            )";
        
        $sql2 = "INSERT INTO equipamento_has_requisicao_equipamento (
            fk_idequipamento, 
            fk_idrequisicao_equipamento
            ) 
            VALUES(
            :idequip, 
            :idreq_eqp
            )";
        
        // Verificar e formatar data e hora corretamente: ???????????????????????????
        $hoje = date('d/m/Y');
        $horaagora = date('H:i');
        // ??????????????????????????????????????????????????????????????????????????
        
        /* *********************************************************************
         * * Esta seria uma tentativa de fazer com que os comandos abaixo entrem
         * * em um "bloco de transação".
         * *********************************************************************
         */
        DatabaseHandler::BeginTransaction();
        
        try {
        
            for($i=0; $i <= sizeof($array_datas); $i++) {

                $params1 = array (
                ':dt_requisicao' => $hoje,
                ':hr_requisicao' => $horaagora,
                ':dt_retirada' => $$array_datas[$i], // THE MAGIC
                ':hr_retirada' => $hora_emprestimo,
                ':dt_devolucao' => $data_devolucao,
                ':hr_devolucao' => $hora_devolucao,
                ':descricao_uso' => $descricao_uso,
                ':fk_cpf' => $cpf
                );

                // Tentar fazer com TRANSACAO ?????????????????????????????????????
                DatabaseHandler::Execute($sql1, $params1);

                // Pegar ULTIMA ID DA TABELA: REQUISICAO_EQUIPAMENTO
                // ?????????????????????????????????????????????????
                $last_id_req_eqp = GetLastIdRequisicaoEquipamento();
                // ?????????????????????????????????????????????????

                $params2 = array (
                    ':idequip' => $idEquip,
                    ':idreq_eqp' => $last_id_req_eqp
                );

                DatabaseHandler::Execute($sql2, $params2);

            } // END FOR
        } catch (PDOException $pdoex) {
            DatabaseHandler::RollBackTransaction(); // RollBack se ocorrer erro
            trigger_error($pdoex->getMessage() . "Ocorreu um error na transação do registro de requisição/equipamento!");

        } // END TRY CATCH
        
        DatabaseHandler::CommitTransaction(); // Salva ALTERAÇÃOS SE NÃO HOUVE ERROS DURANTE A TRANSAÇÃO

    }
    
    private static function GetLastIdRequisicaoEquipamento() {
        $sqlQuery = 'SELECT LAST_INSERT_ID(idrequisicao_equipamento) FROM requisicao_equipamento ORDER BY idrequisicao_equipamento DESC LIMIT 1';
        
        $last_id = DatabaseHandler::GetOne($sqlQuery);
        
        return $last_id;
        
        
    }
    
}

?>
